package com.itheima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.PageVo;
import com.itheima.admin.dto.ModuleAddDto;
import com.itheima.admin.dto.ModuleEditDto;
import com.itheima.admin.dto.ModuleListDto;
import com.itheima.admin.dto.PageDto;
import com.itheima.admin.mapper.ModuleMapper;
import com.itheima.admin.pojo.Module;
import com.itheima.admin.service.IModuleService;
import com.itheima.admin.vo.ModuleListVo;
import com.itheima.admin.vo.ModuleVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ModuleServiceImpl implements IModuleService {
    @Autowired
    private ModuleMapper moduleMapper;
    @Override
    public PageVo<ModuleVo> queryByPage(PageDto pageDto) {
        IPage<Module> page = new Page<>(pageDto.getCurrentPage(),
                pageDto.getPageSize());
        QueryWrapper<Module> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name",pageDto.getQueryString());
        IPage<Module> moduleIPage = moduleMapper.selectPage(page, queryWrapper);
        List<ModuleVo> collect = moduleIPage.getRecords().stream().map(
                module -> {
                    ModuleVo moduleVo = new ModuleVo();
                    BeanUtils.copyProperties(module,moduleVo);
                    return moduleVo;
                }
        ).collect(Collectors.toList());
        return new PageVo<ModuleVo>(collect,(int)moduleIPage.getTotal());
    }

    public static List<ModuleListDto> getRoot(List<ModuleListDto> nodes){
        List<ModuleListDto> root = new ArrayList<>();
        if(nodes != null && nodes.size() > 0){
            for (ModuleListDto treeNode : nodes) {
                if(treeNode.getParentId() == null){
                    root.add(treeNode);
                }
            }
        }
        return root;
    }
    public List<ModuleListVo> recursiveList(List<ModuleListDto> moduleListDtos){
        List<ModuleListVo> list = new ArrayList<ModuleListVo>();
        for(ModuleListDto dto : moduleListDtos){
            ModuleListVo vo1= new ModuleListVo();
            vo1.setId(dto.getModuleId());
            vo1.setLabel(dto.getName());
            if(dto.getChildren()!=null){
                List<ModuleListVo> vo2 = new ArrayList<>();
                vo1.setChildren(recursiveList(dto.getChildren()));
            }
            list.add(vo1);
        }
        return list;
    }

    @Override
    public boolean addModule(ModuleAddDto moduleAddDto) {

        return moduleMapper.insert(moduleAddDto.toModule())>0;
    }

    @Override
    public boolean deleteModule(String id) {
        return moduleMapper.deleteById(id)>0;
    }

    @Override
    public ModuleAddDto queryById(String id) {
        return moduleMapper.selectById(id).toModuleAddDto();
    }

    @Override
    public boolean editModule(ModuleEditDto moduleEditDto) {
        Module module = moduleEditDto.toModule();
        QueryWrapper<Module> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("module_id",module.getModuleId());
        return moduleMapper.update(module,queryWrapper)>0;
    }
}
